Plott med matplotlib
matplotlib
er et bibliotek til Python som gjør det mulig å lage grafer og plott. Matplotlib er laget slik at det skal være enkelt for brukere av MATLAB
til å gå over til Python. Det gjør at Matplotlib føles litt mindre pythonsk enn mange andre pythonbiblioteker.
Installasjon
Prøv å importere Matplotlib med følgende kode
import matplotlib.pyplot as plt
Hvis ikke Matplotlib er installert på datamaskinen så vil du få en feilmelding med No module found
.
Du kan installere Matplotlib i gjennom Mu ved å gå til Innstillinger
→ Third party packages
og skrive inn matplotlib
på en linje i vinduet før du trykker OK
.
Bruker du en annen tekstbehandler så installerer du Matplotlib på samme måte som du installerer andre pakker – for eksempel med pip install matplotlib
eller conda install matplotlib
Bruk matplotlib til å lage graf
Det finnes flere måter å opprette et plott på. Den enkleste moderne måten å gjøre dette er ved hjelp av subplots
.
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
Nå vil variabelen fig
være tilordnet et Figure
-objekt, mens ax
er tilordnet et koordinatsystemobjekt.
fig
?
Tenk på fig
som lerretet som du tegner grafene oppå. Vi bruker metoder på fig
hver gang vi ønsker å gjøre noe med lerretet.
fig.set_size_inches(6,4)
vil gjøre figuren/lerretet 6 tommer bred og 4 tommer høy.- Når vi skal lagre alle grafene våre så bruker vi metoden
fig.savefig("filnavn.svg")
.
Lag linjediagram med ax.plot()
Vi ønsker å vise noen data i plottet vårt. Matplotlib har mange ulike typer diagrammer og grafer innebygd. Den vanligste graftypen er linjediagrammet som er tilgjengelig med ax.plot()
. Metoden trenger som et minimum argumentene x
og y
. Dette skal være to lister eller arrays med data. Listene må være like lange.
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
x = np.linspace(0,3,100)
y1 = x**2
y2 = 2*x
ax.plot(x, y1, c="blue", label="$x^2$")
ax.plot(x, y2, c="red", linestyle="dashed", label="$2x$")
ax.legend()
ax.set_title("$x^2$ og $2x$")
plt.show()
Eksempelet ovenfor lager en Numpy array med 100 x
-verdier mellom 0 og 3. Deretter lager den to nye arrays y1
og y2
som vil inneholde funksjonsverdiene til
ax.plot()
kan ta inn mange flere argumenter enn hva jeg brukte ovenfor. Du finner en full oversikt i dokumentasjonen. I eksempelet mitt brukte jeg
c
som definerer fargen på grafen.linestyle
som definerer hvordan linja mellom punktene skal tegnes.label
som definerer hvilket navn som skal stå i forklaringsboksen.
I dette plottet har jeg også lagt inn en forklaringsboks med ax.legend()
og en tittel på diagrammet med ax.set_title()
.[1] Til slutt er det viktig å gi beskjed om at plottet skal vises på skjermen med plt.show()
. Du kan eventuelt lagre figuren med fig.savefig("filnavn.svg")
eller plt.savefig("filnavn.png")
.
Sett egenskaper ved subplottet
Vi har allerede endret tittelen til subplottet med ax.set_title()
. Vi kan også endre mange andre egenskaper ved subplottet. De viktigste egenskapene er:
ax.set_xlim(0, 3)
sier atx
-verdiene som skal vises er mellom 0 og 3ax.set_ylim(-2, 3)
sier aty
-verdiene som skal vises er mellom -2 og 3ax.set_xlabel("Navn på x-akse")
setter navnet som skal vises langs-aksen. ax.set_ylabel("Navn på y-akse")
setter navnet som skal vises langs-aksen. ax.grid()
gir et rutenett i bakgrunnen
Lag stolpediagram med ax.bar()
Det er enkelt å lage stolpediagrammer med ax.bar()
. Se eksempelet nedenfor. Legg merke til at i dette tilfellet er
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
frukter = ['epler', 'pærer', 'bananer', 'appelsiner']
antall = [40, 100, 30, 55]
ax.bar(frukter, antall)
ax.set_ylabel('Antall frukter')
ax.set_title('Salg av ulike frukter')
plt.show()
Lage histogram med ax.hist()
For å lage histogrammer kan du bruke ax.hist()
. I eksempelet nedenfor så bruker jeg scipy.stats.binom.rvs
til å lage 1000 utvalg fra en Binomisk fordeling med størrelse
from scipy.stats import binom
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
N = 1000
# binom.rvs(n, p, size=N) trekker N stk fra binomisk fordeling
# med n og sannsynlighet p
X = binom.rvs(100, 0.3, size=N)
antall_stolper = 10 # antall stolper i histogrammet
ax.hist(X, bins=antall_stolper, density=True, edgecolor='white')
plt.show()
Jeg brukte følgende parametere på ax.hist()
:
X
er en liste med data. I vårt tilfelle en liste med 1000 elementer. Hvert element er antallet suksesser i det aktuelle utvalget, altså et tall mellom 0 og 100.bins=antall_stolper
forteller hvor mange søyler vi ønskerdensity=True
gjør at-aksen viser sannsynligheter. Hvis du heller ønsker absolutte tall på -aksen bruker du density=False
.edgecolor="white"
gjør at vi får en flott hvit kantlinje på søylene
Tips
Lag flere subplots i samme figur
Hvis du vil ha flere plott på den samme figuren så gir du argumenter til subplots
. Hvis du ønsker å ha 2 rader med 3 plott i hver rad kan du skrive:
fig, ax = plt.subplots(2,3)
ax
er nå en nøstet liste med 2
[ [plott1, plott2, plott3], [plott4, plott5, plott6] ]
.
For å plotte noe i øverste venstre koordinatsystem (her kalt plott1
) så bruker du ax[0, 0].plot(x_verdier, y_verdier)
og for å plotte til det nedre, midterste koordinatsystemet (her kalt plott5
) så skriver du ax[1, 1].plot(x_verdier, y_verdier)
.
Lag fine plott med koordinatakser med piler
I lærebøker så er det vanlig at koordinataksene skjærer i origo og er merket med piler i positiv retning. Du kan få denne stilen ved å følge dette eksempelet.
Velg stilark
Matplotlib kommer med mange ferdige stilark, se hjemmesiden for et galleri med eksempler. Du velger stilark med
plt.style.use('default')
Jeg liker ggplot
. For bruk på sider med mørk bakgrunn bruker jeg gjerne dark_background
og lagrer figurene mine med fig.savefig("filnavn.svg", transparent=True)
. Da vil bakgrunnen være gjennomsiktig, men grafene får farger som fungerer fint på mørke bakgrunner.